package models;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import models.utilities.AdminReports;
public class Bank implements BancProc, Serializable {
private static final long serialVersionUID = 1L;
private HashMap<Person, ArrayList<Account>> content;
public Bank() {
this.content = new HashMap<Person, ArrayList<Account>>();
}
@Override
public void addPerson(Person p) {
assert isWellFormed();
assert p != null;
assert p.getName() != null;
int n = getNumberOfPersons();
if (!content.containsKey(p)) {
content.put(p, new ArrayList<Account>());
}
assert (getNumberOfPersons() != 0) && (getNumberOfPersons() == n + 1);
assert isWellFormed();
}
@Override
public void deletePerson(Person p) {
assert isWellFormed();
assert getNumberOfPersons() != 0 && getNumberOfAccounts() != 0;
assert p != null;
assert content.containsKey(p);
int n = getNumberOfAccounts();
if (content.containsKey(p)) {
content.remove(p);
}
assert !(content.containsKey(p));
assert getNumberOfAccounts() == n - 1;
assert isWellFormed();
}
@Override
public void addAccountToHolder(Account a, Person p) {
assert isWellFormed();
assert p != null && a != null;
assert content.get(p) != null;
int n = getNumberOfAccounts();
if (content.containsKey(p)) {
content.get(p).add(a);
a.addObserver(p);
} else {
addPerson(p);
content.get(p).add(a);
a.addObserver(p);
}
assert getNumberOfAccounts() == n + 1;
assert isWellFormed();
}
@Override
public void deleteAccountToHolder(Account a, Person p) {
assert isWellFormed();
assert p != null && a != null;
assert content.get(p) != null;
int n = getNumberOfAccounts();
if (content.containsKey(p)) {
content.get(p).remove(a);
}
assert getNumberOfAccounts() == n - 1;
assert isWellFormed();
}
public HashMap<Person, ArrayList<Account>> getContent() {
return content;
}
public void setContent(HashMap<Person, ArrayList<Account>> content) {
this.content = content;
}
@Override
public void generateReports() {
new AdminReports();
}
public int getNumberOfPersons() {
return content.size();
}
public int getNumberOfAccounts() {
int size = 0;
Iterator<Entry<Person, ArrayList<Account>>> iterator = content.entrySet().iterator();
while (iterator.hasNext()) {
Entry<Person, ArrayList<Account>> entry = iterator.next();
size = size + entry.getValue().size();
}
return size;
}
private boolean isWellFormed() {
int persons = getNumberOfPersons();
int accounts = getNumberOfAccounts();
int persnum = 0;
int accnum = 0;
Iterator<Entry<Person, ArrayList<Account>>> iterator = content.entrySet().iterator();
while (iterator.hasNext()) {
Entry<Person, ArrayList<Account>> entry = iterator.next();
persnum++;
for (int i = 0; i < entry.getValue().size(); i++) {
if (entry.getValue().get(i) instanceof Account)
accnum++;
}
}
return ((persnum == persons) && (accnum == accounts));
}
}